home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / eselect / modules / blas.eselect < prev    next >
Text File  |  2006-04-12  |  10KB  |  371 lines

  1. # Copyright 1999-2005 Gentoo Foundation
  2. # Distributed under the terms of the GNU General Public License v2
  3. # $Id: blas.eselect 249 2005-12-19 00:43:49Z kugelfang $
  4.  
  5. inherit config multilib portage
  6.  
  7. DESCRIPTION="Manage installed BLAS implementations"
  8. MAINTAINER="Danny van Dyk <kugelfang@gentoo.org>"
  9. SVN_DATE='$Date: 2005-12-19 00:43:49 +0000 (Mon, 19 Dec 2005) $'
  10. VERSION=$(svn_date_to_version "${SVN_DATE}")
  11.  
  12. BLAS_CONFIG="${ROOT}/var/lib/eselect/blas/blas.config"
  13. BLAS_IMPLEMENTATIONS="ACML ATLAS threaded-ATLAS MKL72 reference"
  14. BLAS_PROFILES="C F77"
  15.  
  16. # TODO
  17. # * make compatible with threaded-atlas target
  18.  
  19.  
  20. # check_* $libdir
  21. # implementation specific check functions
  22. check_ACML() {
  23.     # libacml.so provides C/C++ and FORTRAN 77 support
  24.     [[ -f ${1}/libacml.so ]] && echo "C F77"
  25. }
  26.  
  27. check_ATLAS() {
  28.     [[ -d ${1}/blas/atlas ]] || return
  29.     local ret
  30.     # libblas.so provides FORTRAN 77 support
  31.     [[ -f ${1}/blas/atlas/libblas.so ]] && ret="F77"
  32.     # libcblas.so provides C/C++ support
  33.     [[ -f ${1}/blas/atlas/libcblas.so ]] && ret="${ret} C"
  34.     echo "${ret}"
  35. }
  36.  
  37. check_threaded-ATLAS() {
  38.     [[ -d ${1}/blas/threaded-atlas ]] || return
  39.     local ret
  40.     # libblas.so provides FORTRAN 77 support
  41.     [[ -f ${1}/blas/threaded-atlas/libblas.so ]] && ret="F77"
  42.     # libcblas.so provides C/C++ support
  43.     [[ -f ${1}/blas/threaded-atlas/libcblas.so ]] && ret="${ret} C"
  44.     echo "${ret}"
  45. }
  46.  
  47. check_MKL72() {
  48.     [[ -d ${ROOT}/opt/intel/mkl72 ]] || return
  49.     local dir
  50.     case $(arch) in
  51.         amd64)    dir="em64t";;
  52.         ia64)    dir="64";;
  53.         x86)    dir="32";;
  54.     esac
  55.     [[ -f ${ROOT}/opt/intel/mkl72/lib/${dir}/libmkl.so ]] \
  56.         && echo "F77 C"
  57. }
  58.  
  59. check_reference() {
  60.     [[ -d ${1}/blas/reference ]] || return
  61.     local ret
  62.     [[ -f ${1}/blas/reference/libblas.so ]] && ret="F77"
  63.     [[ -f ${1}/blas/reference/libcblas.so ]] && ret="${ret} C"
  64.     echo "${ret}"
  65. }
  66.  
  67. # package $impl
  68. # Prints the name of the package providing $impl
  69. package() {
  70.     case ${1} in
  71.         ACML)        echo "sci-libs/ACML";;
  72.         ATLAS)        echo "sci-libs/blas-atlas";;
  73.         MKL*)        echo "sci-libs/mkl";;
  74.         reference)    echo "sci-libs/blas-reference";;
  75.         *) ;;
  76.     esac
  77. }
  78.  
  79. # is_active_* $lib
  80. # return 0 if $lib points to an active BLAS implementation of profile *
  81. is_active_ACML() {
  82.     [[ -L ${1} ]] || return 1
  83.     local lib=$(readlink -sn ${1})
  84.     [[ $(basename ${lib}) == libacml.so ]] \
  85.         && return 0
  86.     return 1
  87. }
  88.  
  89. is_active_ATLAS() {
  90.     [[ -L ${1} ]] || return 1
  91.     local lib=$(readlink -sn ${1})
  92.     local dir=${lib%/*}
  93.     [[ ${dir##*/} == atlas ]] \
  94.         && return 0
  95.     return 1
  96. }
  97.  
  98. is_active_threaded-ATLAS() {
  99.     [[ -L ${1} ]] || return 1
  100.     local lib=$(readlink -sn ${1})
  101.     local dir=${lib%/*}
  102.     [[ ${dir##*/} == threaded-atlas ]] \
  103.         && return 0
  104.     return 1
  105. }
  106.  
  107. is_active_MKL() {
  108.     [[ -L ${1} ]] || return 1
  109.     local lib=$(readlink -sn ${1})
  110.     [[ $(basename ${lib}) == libmkl.so ]] \
  111.         && return 0
  112.     return 1
  113. }
  114.  
  115. is_active_MKL72() {
  116.     is_active_MKL $@
  117. }
  118.  
  119. is_active_reference() {
  120.     [[ -L ${1} ]] || return 1
  121.     local lib=$(readlink -sn ${1})
  122.     local dir=${lib%/*}
  123.     [[ ${dir##*/} == reference ]] \
  124.         && return 0
  125.     return 1
  126. }
  127.  
  128. # setup_* $libdir $profile
  129. # Implementation specific activation/setup functions
  130. setup_ACML() {
  131.     if [[ ${2} == C ]] ; then
  132.         ln -sf ${1}/libacml.so ${1}/libcblas.so
  133.         ln -sf ${1}/libacml.so ${1}/libcblas.so.0
  134.         ln -sf ${1}/libacml.a  ${1}/libcblas.a
  135.     elif [[ ${2} == F77 ]] ; then
  136.         ln -sf ${1}/libacml.so ${1}/libblas.so
  137.         ln -sf ${1}/libacml.so ${1}/libblas.so.0
  138.         ln -sf ${1}/libacml.a  ${1}/libblas.a
  139.     else
  140.         die "Illegal profile: ${2}"
  141.     fi
  142. }
  143.  
  144. setup_ATLAS() {
  145.     if [[ ${2} == C ]] ; then
  146.         ln -sf ${1}/blas/atlas/libcblas.so ${1}/libcblas.so
  147.         ln -sf ${1}/blas/atlas/libcblas.so ${1}/libcblas.so.0
  148.         ln -sf ${1}/blas/atlas/libcblas.a  ${1}/libcblas.a
  149.     elif [[ ${2} == F77 ]] ; then
  150.         ln -sf ${1}/blas/atlas/libblas.so ${1}/libblas.so
  151.         ln -sf ${1}/blas/atlas/libblas.so ${1}/libblas.so.0
  152.         ln -sf ${1}/blas/atlas/libblas.a  ${1}/libblas.a
  153.     else
  154.         die "Illegal profile: ${2}"
  155.     fi
  156. }
  157.  
  158. setup_threaded-ATLAS() {
  159.     if [[ ${2} == C ]] ; then
  160.         ln -sf ${1}/blas/threaded-atlas/libcblas.so ${1}/libcblas.so
  161.         ln -sf ${1}/blas/threaded-atlas/libcblas.so ${1}/libcblas.so.0
  162.         ln -sf ${1}/blas/threaded-atlas/libcblas.a  ${1}/libcblas.a
  163.     elif [[ ${2} == F77 ]] ; then
  164.         ln -sf ${1}/blas/threaded-atlas/libblas.so ${1}/libblas.so
  165.         ln -sf ${1}/blas/threaded-atlas/libblas.so ${1}/libblas.so.0
  166.         ln -sf ${1}/blas/threaded-atlas/libblas.a  ${1}/libblas.a
  167.     else
  168.         die "Illegal profile: ${2}"
  169.     fi
  170. }
  171.  
  172. setup_MKL72() {
  173.     local dir
  174.     case $(arch) in
  175.         amd64)    dir="em64t";;
  176.         ia64)    dir="64";;
  177.         x86)    dir="32";;
  178.     esac
  179.     if [[ ${2} == C ]] ; then
  180.         ln -sf ${ROOT}/opt/intel/mkl72/lib/${dir}/libmkl.so \
  181.             ${1}/libcblas.so
  182.         ln -sf ${ROOT}/opt/intel/mkl72/lib/${dir}/libmkl.so \
  183.             ${1}/libcblas.so.0
  184.         # No static library for MKL72
  185.         rm ${1}/libcblas.a &> /dev/null
  186.     elif [[ ${2} == F77 ]] ; then
  187.         ln -sf ${ROOT}/opt/intel/mkl72/lib/${dir}/libmkl.so \
  188.             ${1}/libblas.so
  189.         ln -sf ${ROOT}/opt/intel/mkl72/lib/${dir}/libmkl.so \
  190.             ${1}/libblas.so.0
  191.         rm ${1}/libblas.a &> /dev/null
  192.     else
  193.         die "Illegal profile: ${2}"
  194.     fi
  195. }
  196.  
  197. setup_reference() {
  198.     if [[ ${2} == F77 ]] ; then
  199.         ln -sf ${1}/blas/reference/libblas.so ${1}/libblas.so
  200.         ln -sf ${1}/blas/reference/libblas.so ${1}/libblas.so.0
  201.         ln -sf ${1}/blas/reference/libblas.a  ${1}/libblas.a
  202.     elif [[ ${2} == C ]] ; then
  203.         return 1
  204.     else
  205.         die "Illegal profile: ${2}"
  206.     fi
  207. }
  208.  
  209. ### list action ###
  210.  
  211. describe_list() {
  212.     echo "List all installed BLAS implementations"
  213. }
  214.  
  215. do_list() {
  216.     local libdirs libdir x
  217.     [[ -z "$@" ]] \
  218.         && libdirs="$(list_libdirs)" \
  219.         || libdirs="$@"
  220.  
  221.     [[ -f ${BLAS_CONFIG} ]] \
  222.         || eselect blas scan
  223.  
  224.     for libdir in ${libdirs} ; do
  225.         C_PROFILES=$(load_config ${BLAS_CONFIG} C_${libdir})
  226.         F77_PROFILES=$(load_config ${BLAS_CONFIG} F77_${libdir})
  227.         if [[ -n ${C_PROFILES} ]] || [[ -n ${F77_PROFILES} ]] ; then
  228.             if [[ -n ${C_PROFILES} ]] ; then
  229.                 write_list_start "C/C++ profiles in ${ROOT}/usr/${libdir}"
  230.                 for x in ${C_PROFILES} ; do
  231.                     active=''
  232.                     is_active_${x} ${ROOT}/usr/${libdir}/libcblas.so \
  233.                         && active=' *'
  234.                     write_kv_list_entry ${x} \
  235.                         "($(package ${x}))$(highlight "${active}")"
  236.                 done
  237.                 echo
  238.             fi
  239.             if [[ -n ${F77_PROFILES} ]] ; then
  240.                 write_list_start "FORTRAN 77 profiles in ${ROOT}/usr/${libdir}"
  241.                 for x in ${F77_PROFILES} ; do
  242.                     active=''
  243.                     is_active_${x} ${ROOT}/usr/${libdir}/libblas.so \
  244.                         && active=' *'
  245.                     write_kv_list_entry ${x} \
  246.                         "($(package ${x}))$(highlight "${active}")"
  247.                 done
  248.                 echo
  249.             fi
  250.         fi
  251.     done
  252. }
  253.  
  254. ### select action ###
  255.  
  256. describe_set() {
  257.     echo "Activate one of the installed BLAS implementations"
  258. }
  259.  
  260. do_set() {
  261.     local libdirs=$(list_libdirs) profiles=${BLAS_PROFILES} impl libdir prof
  262.     [[ ${#1} == 0 ]] \
  263.         && die -q "Please specify the implementation to setup as active."
  264.     impl=${1}
  265.     shift
  266.     
  267.     [[ -f ${BLAS_CONFIG} ]] \
  268.         || eselect blas scan
  269.  
  270.     has ${impl} ${BLAS_IMPLEMENTATIONS} \
  271.         || die -q "Illegal implementation: ${impl}"
  272.  
  273.     for param in ${@} ; do
  274.         if has ${param} ${libdirs} ; then
  275.             mylibdirs=(${mylibdirs[@]} ${param})
  276.         elif has ${param} ${BLAS_PROFILES} ; then
  277.             myprofiles=(${myprofiles[@]} ${param})
  278.         else
  279.             die -q "Illegal parameter: ${param}."
  280.         fi
  281.     done
  282.     [[ -n ${mylibdirs[@]} ]] && libdirs=${mylibdirs[@]}
  283.     [[ -n ${myprofiles[@]} ]] && profiles=${myprofiles[@]}
  284.  
  285.     write_list_start "Changing BLAS implementation to $(highlight ${impl}) in"
  286.     echo "  ${libdirs}"
  287.     write_list_start "Affected language interfaces"
  288.     for libdir in ${libdirs} ; do
  289.         for prof in ${profiles} ; do
  290.             has ${prof} $(check_${impl} ${ROOT}/usr/${libdir}) || continue
  291.             if setup_${impl} ${ROOT}/usr/${libdir} ${prof} ; then
  292.                 if ! has ${prof} ${myprofiles[@]} ; then
  293.                     myprofiles=( ${myprofiles[@]} ${prof} )
  294.                 fi
  295.                 store_config ${BLAS_CONFIG} "${prof}_${libdir}_CURRENT" ${impl}
  296.             fi
  297.         done
  298.     done
  299.     echo "  ${myprofiles[@]}"
  300. }
  301.  
  302. ### show action ###
  303.  
  304. describe_show() {
  305.     echo "Show the currently active BLAS implementations"
  306. }
  307.  
  308. do_show() {
  309.     local libdirs=$(list_libdirs) profiles=${BLAS_PROFILES} libdir lib prefix
  310.     
  311.     [[ -f ${BLAS_CONFIG} ]] \
  312.         || eselect blas scan
  313.  
  314.     [[ -n ${1} ]] && has ${1} ${libdirs} && libdirs=${1}
  315.     [[ -n ${2} ]] && has ${2} ${profiles} && profiles=${2}
  316.     
  317.     write_list_start "Active BLAS implementations"
  318.     for libdir in ${libdirs} ; do
  319.         [[ ${#libdirs} -eq 1 ]] || prefix="${ROOT}/usr/${libdir}"
  320.         for prof in ${profiles} ; do
  321.             [[ ${prof} == C ]] && lib=libcblas.so
  322.             [[ ${prof} == F77 ]] && lib=libblas.so
  323.             impl=$(load_config ${BLAS_CONFIG} "${prof}_${libdir}_CURRENT")
  324.             if [[ -z ${impl} ]] ; then
  325.                 write_kv_list_entry "${prefix} (${prof})" "(none)"
  326.                 #[[ -n $(load_config ${BLAS_CONFIG} "${prof}_${libdir}") ]] \
  327.                 #    && die -q "Configuration file is broken. Please run scan.${prof}_${libdir}"
  328.             else
  329.                 if is_active_${impl} ${ROOT}/usr/${libdir}/${lib} ; then
  330.                     write_kv_list_entry "${prefix} (${prof})" "${impl} ($(package ${impl}))"
  331.                 else
  332.                     die -q "Configuration file is out of date. Please run scan."
  333.                 fi
  334.             fi
  335.         done
  336.     done
  337. }
  338.  
  339. ### update action ###
  340.  
  341. describe_scan() {
  342.     echo "Scans the system for data about all installed BLAS implementations"
  343. }
  344.  
  345. do_scan() {
  346.     local lib libdir impl prof
  347.     [[ -e ${BLAS_CONFIG} ]] \
  348.         && rm ${BLAS_CONFIG}
  349.     for libdir in $(list_libdirs) ; do
  350.         [[ -d ${ROOT}/usr/${libdir} ]] \
  351.             && [[ ! -h ${ROOT}/usr/${libdir} ]] \
  352.             || continue
  353.         for impl in ${BLAS_IMPLEMENTATIONS} ; do
  354.             for prof in $(check_${impl} ${ROOT}/usr/${libdir}/) ; do
  355.                 if has ${prof} ${BLAS_PROFILES} ; then
  356.                     append_config ${BLAS_CONFIG} "${prof}_${libdir}" ${impl}
  357.                     [[ ${prof} == C ]] && lib=${ROOT}/usr/${libdir}/libcblas.so
  358.                     [[ ${prof} == F77 ]] && lib=${ROOT}/usr/${libdir}/libblas.so
  359.                     is_active_${impl} ${lib} \
  360.                         && store_config ${BLAS_CONFIG} \
  361.                             "${prof}_${libdir}_CURRENT" ${impl}
  362.                 else
  363.                     die -q "Unknown profile: \"${prof}\". Valid profiles: ${BLAS_PROFILES}"
  364.                 fi
  365.             done
  366.         done
  367.     done
  368. }
  369.  
  370. # vim: set ft=eselect
  371.